package com.dp1.deliversoft.algorithm;

import java.util.ArrayList;

import com.dp1.deliversoft.entidad.Mapa;
import com.dp1.deliversoft.entidad.Pedido;
import com.dp1.deliversoft.entidad.Ruta;
import com.dp1.deliversoft.entidad.TablaRuteoAux;
import com.dp1.deliversoft.entidad.Tarifas;
import com.dp1.deliversoft.entidad.Vehiculo;

public class Borrador {
	public ArrayList<Ruta> ParticionarEnZonas(ArrayList<Ruta> zonas, Ruta S) {
		ArrayList<Ruta> zonas1, zonas2;
		ArrayList<Integer> centro;
		Vehiculo vehiculo;
		int cx, cy;

		// int cx, cy;
		int costoHorizontal, costoVertical;
		Ruta S1, S2;

		// if (UnSoloVehiculoNoAbastece(S)) {
		if (S.cantPaquetes() > 25) { // DEBE SER CON AUTO O MOTO y segun la
										// capacidad de ese vehiculo

			// if (noHayVehiculoDisponible(S)) {
			// if ((vehiculo = autoDisponible())!=null){
			if (true) {
				centro = S.calcularCentroX(mapa);
				cx = cx / 2;
				cy = cy / 2;
				// cx = centro.get(0);
				// cy = centro.get(1); // Suma de los costos de la ruta de abajo
				// y
				// de arriba
				// incluyendo ida y retorno al almacen

				ArrayList<Ruta> lRHorizontal = new ArrayList<Ruta>();
				lRHorizontal = partirRutaEn2SegunCriterio(S, cx, cy, "H");
				costoHorizontal = (int) (lRHorizontal.get(0).getCostoRuta() + lRHorizontal
						.get(1).getCostoRuta()); // Falta calcular El costo de
													// las
				// Rutas en Horizontal

				ArrayList<Ruta> lRVertical = new ArrayList<Ruta>();
				lRVertical = partirRutaEn2SegunCriterio(S, cx, cy, "V");
				costoVertical = (int) (lRHorizontal.get(0).getCostoRuta() + lRHorizontal
						.get(1).getCostoRuta());

				if (costoHorizontal >= costoVertical) {
					S1 = lRHorizontal.get(0);
					S2 = lRHorizontal.get(1);
				} else {
					S1 = lRVertical.get(0);
					S2 = lRVertical.get(1);
				}
				zonas.add(S1);
				zonas.add(S2);

				// zonas1 = ParticionarEnZonas(zonas, S1);
				// zonas2 = ParticionarEnZonas(zonas, S2);

				/*
				 * for (int i = 0; i < zonas1.size(); i++) {
				 * zonas.add(zonas1.get(i)); } for (int i = 0; i <
				 * zonas2.size(); i++) { zonas.add(zonas2.get(i)); }
				 */

			} else {
				// Colocar la ruta en estado de espera de vehiculo o verificar
				// para cuando estara disponible
			}
		} else {
			// if ((vehiculo = autoDisponible())!=null) {
			if (true) {
				// S.setVehiculo(vehiculo);
				// zonas.asignarVehiculo(S);
				zonas.add(S);
			} else {
				// Colocar la ruta en estado de espera de vehiculo o verificar
				// para cuando estara disponible
			}
		}
		return zonas;
	}
	

	public ArrayList<Ruta> rutearPedidos(Mapa m, ArrayList<Pedido> pedidos,
			TablaRuteoAux tabAux) {
		Ruta S, rutaOptimizada; // S es una solucion de ruta
		boolean cumplio, considerarPlazos;

		S = new Ruta();
		S.setPedidos(pedidos);
		zonas = new ArrayList<Ruta>();
		zonas.add(S);

		tarifas = new Tarifas();
		this.mapa = m;
		this.pedidos = pedidos;
		this.tabAux = tabAux;

		/*
		 * //debe haber un hilo que vaya liberando a los vehiculos. No se puede
		 * hacer segun lo planifado solamente por el tema de las averias
		 */
		cantVehiculosPorAsignar = CalcularCantVehiculosLibres();
		// SIVA S = GeneraRuta(pedidos.size(), pedidos, false);
		// Obtiene unasola ruta
		// SIVA zonas = ParticionarEnZonas(S); // Cada zona contiene una ruta
		// que cumple
		// con las restricciones de capacidad de
		// los vehiculos

		for (int i = 0; i < zonas.size(); i++) // Para cada zonas verifico si se
												// cumplen todos los plazos de
												// entrega
		{
			// SIVA //cumplio = CumplenPlazos(zonas.get(i));
			cumplio = false; // HARDCODEADO EN TRUE POR FINES DE DEBUGEO SIN
								// ESTA
								// PARTE DE DIVIR EN ZONAS
			if (!cumplio) {
				considerarPlazos = false;
				/*
				 * empezara oliendo casas porque ya antes se ha llenado los
				 * caminos de feromonas y ahora considerara plazos
				 */
				rutaOptimizada = GeneraRuta(zonas.get(i).getPedidos().size(),
						zonas.get(i).getPedidos(), considerarPlazos, mapa,
						this.tabAux);

				// cumplio = CumplenPlazos(rutaOptimizada);
				if (rutaOptimizada.getCostoRuta() <= zonas.get(i)
						.getCostoRuta()) {
					zonas.set(i, rutaOptimizada);
				}
			}
		}
		return zonas; // Zonas es el conjunto de rutas cada una con el debido
						// vehiculo asignado
	}

}
